package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.event.RowEditEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.controlador.backingBean.BKComposicionArticulo;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioCategoriaArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioComposicionArticulo;
import pe.com.cotelasa.scp.entidad.ComposicionArticulo;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.CategoriaArticulo;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBComposicionArticulo")
@Scope("request")
public class MBComposicionArticulo extends MBGenerico implements Serializable {

    @Inject
    private BKComposicionArticulo bkComposicionArticulo;
    @Inject
    private IServicioArticulo servicioArticulo;
    @Inject
    private IServicioCategoriaArticulo servicioCategoriaArticulo;
    @Inject
    private IServicioComposicionArticulo servicioComposicionArticulo;
    @Autowired
    BKSession session;
    /*@Inject
     private MBArticulo mbArticulo;*/

    public void eliminarArticulo(ActionEvent actionEvent) {

        ComposicionArticulo articuloEliminado = this.bkComposicionArticulo.getCurrentArticulo();
        if (articuloEliminado.getId() == null) {

            Iterator itr = this.bkComposicionArticulo.getListaArticulo().iterator();
            while (itr.hasNext()) {
                ComposicionArticulo arti = (ComposicionArticulo) itr.next();

                if (articuloEliminado.getIdArticuloComp() == arti.getIdArticuloComp()) {
                    itr.remove();
                    break;
                }
            }
        } else {

            Integer index = bkComposicionArticulo.getListaArticuloEditar().indexOf(articuloEliminado);

            this.bkComposicionArticulo.getListaArticulo().remove(articuloEliminado);
            articuloEliminado.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            articuloEliminado.setFecModificacion(new Date());
            articuloEliminado.setUsrModificacion(session.getUsuario().getUsuario());
            this.bkComposicionArticulo.getListaArticuloEditar().set(index, articuloEliminado);
        }
        if (articuloEliminado.getTipo().equals("%")) {
            bkComposicionArticulo.setSumaCantidad(bkComposicionArticulo.getSumaCantidad().subtract(articuloEliminado.getCantidad()));
        }
        //mbArticulo.armarDescripcion();
    }

    public void agregarArticulo(ActionEvent actionEvent) {
        ComposicionArticulo articuloAgregado = this.bkComposicionArticulo.getFormularioArticulo();
        articuloAgregado.setUsrCreacion(session.getUsuario().getUsuario());
        articuloAgregado.setFecCreacion(new Date());
        articuloAgregado.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
        if (articuloAgregado.getTipo().equals("%")) {
            sumarPorcentajes(articuloAgregado.getCantidad(), "A");
        }

        if (bkComposicionArticulo.getSumaCantidad().doubleValue() <= 100) {
            articuloAgregado.setIdArticuloComp(this.bkComposicionArticulo.getIdArticulo());

            boolean band = false;
            for (ComposicionArticulo comp : this.bkComposicionArticulo.getListaArticulo()) {
                if (articuloAgregado.getIdArticuloComp().equals(comp.getIdArticuloComp())) {
                    band = true;
                }
            }
            if (band) {
                mostrarError("Ya se agrego este articulo");
            } else {
                this.bkComposicionArticulo.setIdArticulo(null);
                this.bkComposicionArticulo.getListaArticulo().add(articuloAgregado);
                this.bkComposicionArticulo.getListaArticuloEditar().add(articuloAgregado);
                this.bkComposicionArticulo.setFormularioArticulo(new ComposicionArticulo());
                //mbArticulo.armarDescripcion();
            }
        } else {
            mostrarError("Excedió el 100%");
            bkComposicionArticulo.setSumaCantidad(bkComposicionArticulo.getSumaCantidad().subtract(articuloAgregado.getCantidad()));
        }


    }

    public void sumarPorcentajes(BigDecimal valor, String tipo) {
        bkComposicionArticulo.setSumaCantidad(BigDecimal.ZERO);
        for (ComposicionArticulo comp : this.bkComposicionArticulo.getListaArticulo()) {
            if (comp.getTipo().equals("%")) {
                bkComposicionArticulo.setSumaCantidad(bkComposicionArticulo.getSumaCantidad().add(comp.getCantidad()));
            }
        }
        if (tipo.equals("A")) {
            bkComposicionArticulo.setSumaCantidad(bkComposicionArticulo.getSumaCantidad().add(valor));
        }

    }

    public void editarArticulo(RowEditEvent event) {
        ComposicionArticulo articuloEditado = (ComposicionArticulo) event.getObject();
        Integer index = 0;//this.bkComposicionArticulo.getListaArticuloEditar().indexOf(articuloEditado);

        for (ComposicionArticulo comp : this.bkComposicionArticulo.getListaArticuloEditar()) {
            if (comp.getIdArticuloComp() == articuloEditado.getIdArticuloComp()) {
                if (articuloEditado.getId() != null) {
                    articuloEditado.setUsrModificacion(session.getUsuario().getUsuario());
                    articuloEditado.setFecModificacion(new Date());
                }
                break;
            }
            index++;
        }

        this.bkComposicionArticulo.getListaArticuloEditar().set(index, articuloEditado);
        sumarPorcentajes(BigDecimal.ZERO, "E");
        if (bkComposicionArticulo.getSumaCantidad().doubleValue() > 100) {
            mostrarError("Excedió el 100%");
            bkComposicionArticulo.setSumaCantidad(bkComposicionArticulo.getSumaCantidad().subtract(articuloEditado.getCantidad()));
        }
    }

    public void buscarArticulo() {
        try {

            /* if (this.bkComposicionArticulo.getIdCategoriaArticulo() == 0) {
             this.bkComposicionArticulo.setListaArticuloActivos(null);
             this.bkComposicionArticulo.setIdArticulo(null);
             } else {*/
            Articulo articulo = new Articulo();
            articulo.setIdCategoriaArticulo(this.bkComposicionArticulo.getIdCategoriaArticulo());
            this.bkComposicionArticulo.setListaArticuloActivos(servicioArticulo.listarArticulosPorCategoria(articulo));
            //}
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    /**
     * ********************* CARGA COMP ANTIGUA *****************************
     */
    public void inicializarCargaAnt(ActionEvent actionEvent) {

        this.bkComposicionArticulo.setIdCategoriaArticuloAnt(null);
        this.bkComposicionArticulo.setListaArticuloAnt(null);
        this.bkComposicionArticulo.setIdArticuloAnt(null);
        try {
            this.bkComposicionArticulo.setListaCategoriaArticuloAnt(servicioCategoriaArticulo.listarCategoriasArticulosActivos());
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    public void buscarArticuloAnt() {
        try {

            /* if (this.bkComposicionArticulo.getIdCategoriaArticulo() == 0) {
             this.bkComposicionArticulo.setListaArticuloActivos(null);
             this.bkComposicionArticulo.setIdArticulo(null);
             } else {*/
            Articulo articulo = new Articulo();
            articulo.setIdCategoriaArticulo(this.bkComposicionArticulo.getIdCategoriaArticuloAnt());
            this.bkComposicionArticulo.setListaArticuloAnt(servicioArticulo.listarArticulosPorCategoria(articulo));
            //}
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
        }
    }

    public void aplicarDatosAntiguos(ActionEvent actionEvent) {
        try {
            //this.bkComposicionArticulo.getListaArticulo().clear();
            ComposicionArticulo comp = new ComposicionArticulo();
            comp.setIdArticulo(this.bkComposicionArticulo.getIdArticuloAnt());
            for (ComposicionArticulo compSearch : servicioComposicionArticulo.buscarComposicionPorArticulo(comp)) {
                if (compSearch.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                    ComposicionArticulo compAdd = new ComposicionArticulo();
                    compAdd.setCantidad(compSearch.getCantidad());
                    compAdd.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
                    compAdd.setFecCreacion(new Date());
                    compAdd.setIdArticuloComp(compSearch.getIdArticuloComp());
                    compAdd.setTipo(compSearch.getTipo());
                    compAdd.setUsrCreacion(session.getUsuario().getUsuario());
                    this.bkComposicionArticulo.getListaArticulo().add(compAdd);
                    this.bkComposicionArticulo.getListaArticuloEditar().add(compAdd);
                }
            }



        } catch (ServiceException e) {
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
        /*OrdenCompraServicio orden = bkOrdenCompra.getOrdenCompraServicioFormulario();
         iniciarEdicion(orden);*/
    }
}
